/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Frontera;

import Entidad.Analisis;
import Entidad.Cliente;
import Entidad.Muestra;
import Entidad.Solicitud;
import control.ControlCliente;
import control.ControlMuestra;
import control.ControlSolicitud;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ProgressMonitor;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Juan
 */
public class TrabajadorRegistrarSolicitud extends SwingWorker<Boolean, String> {
    
    private ArrayList<ModeloTablaAnalisis> modelosAnalisis;
    private boolean aplicarATodas;
    private int IDCLiente;
    private int consecutivoSolicitud;
    private int tipoDisposicion;
    private DefaultTableModel modeloTablaMuestras;
    private ProgressMonitor monitor;
    private Solicitud nuevaSolicitud;

    public TrabajadorRegistrarSolicitud(ArrayList<ModeloTablaAnalisis> modelosAnalisis, boolean aplicarATodas, int IDCLiente, int consecutivoSolicitud, int tipoDisposicion, DefaultTableModel modeloTablaMuestras, ProgressMonitor monitor, Solicitud nuevaSolicitud) {
        this.modelosAnalisis = modelosAnalisis;
        this.aplicarATodas = aplicarATodas;
        this.IDCLiente = IDCLiente;
        this.consecutivoSolicitud = consecutivoSolicitud;
        this.tipoDisposicion = tipoDisposicion;
        this.modeloTablaMuestras = modeloTablaMuestras;
        this.monitor = monitor;
        this.nuevaSolicitud = nuevaSolicitud;
    }

    @Override
    protected Boolean doInBackground() throws Exception {
        
        publish("Validando la selección de análisis...");
        ArrayList<Analisis> listaAnalisis = new ArrayList<>();
        
        if(aplicarATodas){
            Analisis unico = modelosAnalisis.get(0).toAnalisis();
            if(unico == null)
                throw new Exception("Se debe seleccionar al menos un análisis para todas las muestras.");
            else
                listaAnalisis.add(unico);
        }else{
            for (int i = 0; i < modelosAnalisis.size(); i++) {
                Analisis analisis = modelosAnalisis.get(i).toAnalisis();
                if(analisis == null)
                    throw new Exception("No se seleccionó ningún análisis para la muestra número "+String.valueOf(i+1));
                listaAnalisis.add(analisis);
            }
        }
        
        ControlCliente controlCliente = new ControlCliente();
        ControlMuestra controlMuestra = new ControlMuestra();
        ControlSolicitud controlSolicitud = new ControlSolicitud();
        
        publish("Validando los datos de las muestras...");
        int progreso = 0;
        monitor.setMaximum(modeloTablaMuestras.getRowCount() + 1);
        monitor.setProgress(progreso);
        Cliente cliente = controlCliente.cargarCliente(IDCLiente);
        ArrayList<Muestra> listaMuestras = new ArrayList<>();
        int codigoAlpha = controlMuestra.siguienteIDMuestra();
        String abreviaturaCliente = cliente.getAbreviatura();
        
        for (int i = 0; i < modeloTablaMuestras.getRowCount(); i++) {
            Muestra muestra =
                    new Muestra(-1, //id muestra
                                consecutivoSolicitud,
                                abreviaturaCliente,
                                codigoAlpha,
                                (String) modeloTablaMuestras.getValueAt(i, 0), //identificación
                                (Double) modeloTablaMuestras.getValueAt(i, 1), //cantidad
                                (String) modeloTablaMuestras.getValueAt(i, 2), //observaciones
                                (Boolean) modeloTablaMuestras.getValueAt(i, 3), //radioactiva
                                (Boolean) modeloTablaMuestras.getValueAt(i, 4), //magnética
                                tipoDisposicion,
                                false,
                                false,
                                false
            );
            codigoAlpha++;
            try{
                controlMuestra.camposValidos(muestra);
            } catch (Exception e) {
                throw new Exception(e.getMessage()+"\nEn la muestra número"+String.valueOf(i+1));
            }
            listaMuestras.add(muestra);
            monitor.setProgress(++progreso);
        }
        
        nuevaSolicitud.setTotalMuestras(listaMuestras.size());
        
        publish("Registrando los datos de la solicitud...");
        controlSolicitud.registrarSolicitud(nuevaSolicitud);
        
        publish("Registrando las muestras...");
        progreso = 0;
        monitor.setProgress(progreso);
        monitor.setMaximum(listaMuestras.size()+1);
        controlMuestra.iniciarConexion();
        
        for (int i = 0; i < listaMuestras.size(); i++) {
            if(aplicarATodas)
                controlMuestra.registrarMuestra(listaMuestras.get(i), listaAnalisis.get(0));
            else
                controlMuestra.registrarMuestra(listaMuestras.get(i), listaAnalisis.get(i));
            monitor.setProgress(++progreso);
        }
        
        controlCliente.actualizarUltimaMuestra(IDCLiente, codigoAlpha);
        
        controlMuestra.cerrarConexion();
        
        return true;
    }
    
    @Override
    protected void process(List<String> mensajes){
        for (String mensaje : mensajes) {
            monitor.setNote(mensaje);
        }
    }
    
}
